/*
 * Copyright (C) 2014 The Android Open Source Project
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

package com.example.android.bluetoothchat;

import android.app.Activity;
import android.bluetooth.BluetoothAdapter;
import android.bluetooth.BluetoothDevice;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.os.Bundle;
import android.text.TextUtils;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.example.android.bluetoothchat.adapter.MyBlueBoothAdapter;
import com.example.android.common.logger.Log;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

/**
 * This Activity appears as a dialog. It lists any paired devices and
 * devices detected in the area after discovery. When a device is chosen
 * by the user, the MAC address of the device is sent back to the parent
 * Activity in the result Intent.
 */
public class DeviceListActivity extends Activity {
    
    /**
     * Tag for Log
     */
    private static final String TAG = "DeviceListActivity";
    
    /**
     * Return Intent extra
     */
    public static String EXTRA_DEVICE_ADDRESS = "device_address";
    
    /**
     * Member fields
     */
    private BluetoothAdapter mBtAdapter;
    
    /**
     * Newly discovered devices
     */
//    private ArrayAdapter<String> mNewDevicesArrayAdapter;
    private List<BluetoothDevice> deviceList = new ArrayList<BluetoothDevice>();
    private MyBlueBoothAdapter mNewDevicesArrayAdapter;
    
    private MyBlueBoothAdapter mOldDevicesArrayAdapter;
    
    TextView tvTip;
    ProgressBar progressBar;
    
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        
        // Setup the window
        //requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_device_list);
        
        // Set result CANCELED in case the user backs out
        setResult(Activity.RESULT_CANCELED);
        
        tvTip = (TextView) findViewById(R.id.tv_tip);
        progressBar = (ProgressBar) findViewById(R.id.progressBarBottom);
        
        // Initialize the button to perform device discovery
        View scanButton =  findViewById(R.id.tv_tip);
        scanButton.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                doDiscovery();
              //  v.setVisibility(View.GONE);
            }
        });
        
        // Initialize array adapters. One for already paired devices and
        // one for newly discovered devices
        mOldDevicesArrayAdapter = new MyBlueBoothAdapter(this);
        mNewDevicesArrayAdapter = new MyBlueBoothAdapter(this);
        
        // Find and set up the ListView for paired devices
        ListView pairedListView = (ListView) findViewById(R.id.paired_devices);
        pairedListView.setAdapter(mOldDevicesArrayAdapter);
        pairedListView.setOnItemClickListener(mDeviceClickListener);
        
        // Find and set up the ListView for newly discovered devices
        ListView newDevicesListView = (ListView) findViewById(R.id.new_devices);
        newDevicesListView.setAdapter(mNewDevicesArrayAdapter);
        newDevicesListView.setOnItemClickListener(mDeviceClickListener);
        
        // Register for broadcasts when a device is discovered
        // Register for broadcasts when discovery has started
        // Register for broadcasts when discovery has changed
        // Register for broadcasts when discovery has finished
        IntentFilter intentFilter = new IntentFilter();
        intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_STARTED);
        intentFilter.addAction(BluetoothAdapter.ACTION_DISCOVERY_FINISHED);
        intentFilter.addAction(BluetoothDevice.ACTION_FOUND);
        intentFilter.addAction(BluetoothDevice.ACTION_BOND_STATE_CHANGED);
        // 注册监听广播
        registerReceiver(mReceiver, intentFilter);
        
        // Get the local Bluetooth adapter
        mBtAdapter = BluetoothAdapter.getDefaultAdapter();
        
        // Get a set of currently paired devices
        Set<BluetoothDevice> pairedDevices = mBtAdapter.getBondedDevices();
        
        // If there are paired devices, add each one to the ArrayAdapter
        if (pairedDevices.size() > 0) {
            findViewById(R.id.title_paired_devices).setVisibility(View.VISIBLE);
            for (BluetoothDevice device : pairedDevices) {
                mOldDevicesArrayAdapter.add(device);
            }
        }
        else {
            String noDevices = getResources().getText(R.string.none_paired).toString();
            //mOldDevicesArrayAdapter.add(noDevices);
            Toast.makeText(this, noDevices, Toast.LENGTH_SHORT).show();
        }
    }
    
    @Override
    protected void onDestroy() {
        super.onDestroy();
        
        // Make sure we're not doing discovery anymore
        if (mBtAdapter != null) {
            mBtAdapter.cancelDiscovery();
        }
        
        // Unregister broadcast listeners
        this.unregisterReceiver(mReceiver);
    }
    
    /**
     * Start device discover with the BluetoothAdapter
     */
    private void doDiscovery() {
        Log.d(TAG, "doDiscovery()");
        
        // Indicate scanning in the title
        progressBar.setVisibility(View.VISIBLE);
        tvTip.setVisibility(View.GONE);
        
        // Turn on sub-title for new devices
        findViewById(R.id.title_new_devices).setVisibility(View.VISIBLE);
        
        //如果蓝牙没有打开则打开蓝牙开始搜索
        if (!mBtAdapter.isEnabled()) {
            mBtAdapter.enable();    //打开蓝牙
        }
        
        // If we're already discovering, stop it
        if (mBtAdapter.isDiscovering()) {
            mBtAdapter.cancelDiscovery();
        }
        
        // Request discover from BluetoothAdapter
        mBtAdapter.startDiscovery();
    }
    
    /**
     * The on-click listener for all devices in the ListViews
     */
    private AdapterView.OnItemClickListener mDeviceClickListener = new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> av, View v, int arg2, long arg3) {
            // Cancel discovery because it's costly and we're about to connect
            mBtAdapter.cancelDiscovery();
            
            // Get the device MAC address, which is the last 17 chars in the View
            //String info = ((TextView) v).getText().toString();
           // String address = info.substring(info.length() - 17);
    
            BluetoothDevice device = (BluetoothDevice) av.getAdapter().getItem(arg2);
            
            // Create the result Intent and include the MAC address
            Intent intent = new Intent();
            intent.putExtra(EXTRA_DEVICE_ADDRESS, device.getAddress());
            
            // Set result and finish this Activity
            setResult(Activity.RESULT_OK, intent);
            finish();
        }
    };
    
    /**
     * The BroadcastReceiver that listens for discovered devices and changes the title when
     * discovery is finished
     */
    private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            
            // When discovery finds a device
            if (BluetoothDevice.ACTION_FOUND.equals(action)) {
                // Get the BluetoothDevice object from the Intent
                BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
                Log.d(TAG, "ACTION_FOUND:" + device.getName());
                // If it's already paired, skip it, because it's been listed already
                
                // 过滤为配对的device
                if (device.getBondState() != BluetoothDevice.BOND_BONDED) {
                    if (device != null && !TextUtils.isEmpty(device.getAddress())) {
                        // 有则替换，没有就添加
                        if (deviceList.contains(device)) {
                            int index = deviceList.indexOf(device);
                            deviceList.set(index, device);
                        }
                        else {
                            deviceList.add(device);
                        }
                        
                        //更新列表页面
                        mNewDevicesArrayAdapter.replaceAll(deviceList);
                        mNewDevicesArrayAdapter.notifyDataSetChanged();
                    }
                }
            }
            // When discovery is finished, change the Activity title
            else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
                progressBar.setVisibility(View.GONE);
                tvTip.setVisibility(View.VISIBLE);
                tvTip.setText(R.string.click_refresh);
                if (mNewDevicesArrayAdapter.getCount() == 0) {
                    String noDevices = getResources().getText(R.string.none_found).toString();
                    Toast.makeText(context, noDevices, Toast.LENGTH_SHORT).show();
                    //mNewDevicesArrayAdapter.add(noDevices);
                }
            }
            else if (BluetoothAdapter.ACTION_DISCOVERY_STARTED.equals(action)) {
                //开始搜索
                Log.d(TAG, "action_discovery_started");
            }
        }
    };
    
}
